package com.enlorenz.support.bank.iso8583custom.msg;

import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;

import com.enlorenz.common.util.CodeUtils;
import com.enlorenz.common.util.ReflectionUtils;
import com.enlorenz.support.bank.iso8583custom.Iso8583Utils;
import com.enlorenz.support.bank.iso8583custom.IsoConfig;
import com.enlorenz.support.bank.iso8583custom.IsoWrapper;
import com.enlorenz.support.bank.iso8583custom.solab.iso8583.IsoMessage;

/**
 * 消费请求报文
 * @author Karma
 */
public abstract class AbstractIso8583Fields {
	//可用域集合
	private Set<Integer> fieldSet;
	//类型
	private Integer type;
	//报文配置
	private IsoConfig isoConfig;
	
	/**
	 * 获取类型描述
	 * @return
	 */
	public String getTypeDesc() {
		if(null == type){
			return null;
		}
		return CodeUtils.integer2HexString(type);
	}
	

	public int getType() {
		return type;
	}

	public void setType(int type) {
		this.type = type;
	}

	/**
	 * 获取域集合
	 * @return 域集合
	 */
	public Set<Integer> getFieldSet() {
		return fieldSet;
	}

	/**
	 * 是否包含域
	 * @param index 域序列
	 * @return 是否包含
	 */
	public boolean hasField(int index){
		return getFieldSet().contains(index);
	}
	
	/**
	 * 加载isoMessage数据
	 * @param isoMessage 数据
	 */
	public void load(IsoMessage isoMessage){
		fieldSet=Iso8583Utils.
				parseIsoMessage2Object(this,getIsoConfig(), isoMessage);
	}
	
	/**
	 * 打印消息
	 */
	public void print(){
		Iso8583Utils.print(this, getIsoConfig());
	}
	
	/**
	 * 设置属性
	 * @param index 序列
	 * @param value 值
	 */
	public void setValue(int index,Object value){
		IsoWrapper isoWrapper=
				getIsoConfig().getIsoWrapperByIndex(index);
		if(null == isoWrapper){
			return;
		}
		ReflectionUtils.setValue2Field(
				isoWrapper.getFieldName(), this, value);
		fieldSet.add(index);
	}
	
	/**
	 * 获取值
	 * @param index 序列
	 * @return
	 */
	public Object getValue(int index){
		IsoWrapper isoWrapper=getIsoConfig().getIsoWrapperByIndex(index);
		if(null == isoWrapper){
			return null;
		}
		return Iso8583Utils.getIsoData(this, isoWrapper.getFieldName(), isoWrapper.getIsoProperty());
	}
	
	/**
	 * 设置报文配置
	 * @param isoConfig
	 */
	public void setIsoConfig(IsoConfig isoConfig){
		this.isoConfig=isoConfig;
		//初始化域
		init();
	}
	/**
	 * 获取报文配置
	 * @return
	 */
	public IsoConfig getIsoConfig() {
		return isoConfig;
	}
	
	/**
	 * 初始化域
	 */
	protected void init(){
		List<IsoWrapper> isoList=getIsoConfig().getIsoWrapperList();
		fieldSet=new LinkedHashSet<Integer>(isoList.size());
		for(IsoWrapper iso:isoList){
			Object val=ReflectionUtils.getValueFromField(iso.getFieldName(),this);
			if(null!=val){
				fieldSet.add(iso.getIndex());
			}
		}
	}
	
}
